package mtt.us.client.views.fachbereich;

import hmvc4gwt.client.event.HmvcEvent;
import hmvc4gwt.client.event.HmvcEventListener;
import hmvc4gwt.client.view.View;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import mtt.us.client.events.SetModelDataEvent;
import mtt.us.dto.FachbereichDTO;
import mtt.us.dto.MatrikelDTO;
import mtt.us.dto.StudiengangDTO;
import mtt.us.hmvcFramework.client.hmvc.events.RemoveViewEvent;

import com.google.gwt.user.client.HistoryListener;
import com.google.gwt.user.client.ui.AbsolutePanel;
import com.google.gwt.user.client.ui.Hyperlink;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;

public class FachbereichView extends View implements HmvcEventListener, HistoryListener {

	/**
	 * enthält alle Objekt den Listener beinhalten
	 */
	private Map mapEvents = new HashMap();

	/**
	 * enhtält alle Widgets
	 */
	private Panel mainPanel = new AbsolutePanel();
	
	public void doInit() {

		mainPanel.setStylePrimaryName("mainPanel");
		
		/*
		 * View für ListFachbereicheEvent's registrieren
		 */
		getController().register(SetModelDataEvent.class, this);
		
		
	}

	public Widget getWidget() {
		return mainPanel;
	}

	public void handleEvent(HmvcEvent event) {

		if (event instanceof SetModelDataEvent) {

			if (event.getPayload() instanceof FachbereichDTO) {
				refreshTableView((FachbereichDTO) event.getPayload());
			}

		}

	}

	/**
	 * aktualisiert die Liste der Fachbereiche
	 * 
	 * @param listFachbereiche
	 */
	private void refreshTableView(FachbereichDTO fachbereich) {
		
		mainPanel.clear();

		
		/*
		 * Fachbereich-Titel 
		 */
		Label labelTitle1 = new Label(fachbereich.getName());
		labelTitle1.setStylePrimaryName("fachbereichViewTitel1");
		
		mainPanel.add(labelTitle1);
		
		Label labelTitle2 = new Label(fachbereich.getNameFull());
		labelTitle2.setStylePrimaryName("fachbereichViewTitel2");
		
		mainPanel.add(labelTitle2);
		
		/*
		 * jeden Fachbereich in eine Spalte
		 */
		Iterator iterator = fachbereich.getListStudiengaenge().iterator();
		while (iterator.hasNext()) {

			StudiengangDTO studiengang = (StudiengangDTO) iterator.next();

			VerticalPanel verticalPanel = new VerticalPanel();
			verticalPanel.setStylePrimaryName("indexFachbereichPanel");

			/*
			 * Link "Fachbereich X" erstellen
			 */
			Hyperlink linkStudiengangName = new Hyperlink(
					studiengang.getName(), "Studiengang="
							+ studiengang.getId());
			linkStudiengangName.setStylePrimaryName("indexFachbereichTitle");

			/*
			 * zum Panel und zur mapEvents hinzufügen
			 */
			verticalPanel.add(linkStudiengangName);
			mapEvents.put(linkStudiengangName.getTargetHistoryToken(), studiengang);
			
			/*
			 * link zu mapEvents hinzufügen
			 */
			mapEvents.put(linkStudiengangName.getTargetHistoryToken(),
					studiengang);

			/*
			 * Jeden Studiengang des Fachbereichs in die gleiche Spalte
			 */
			Iterator iteratorMatrikel = studiengang.getListMatrikel()
					.iterator();
			while (iteratorMatrikel.hasNext()) {

				MatrikelDTO matrikel = (MatrikelDTO) iteratorMatrikel
						.next();

				/*
				 * Link "<StudiengangName>" erstellen
				 */
				Hyperlink linkMatrikel = new Hyperlink(
						matrikel.getName(), "Matrikel="
								+ matrikel.getId());
				linkMatrikel.setStylePrimaryName("indexStudiengangList");

				/*
				 * Studiengang zur Event-Map hinzufügen
				 */
				mapEvents.put(linkMatrikel.getTargetHistoryToken(),
						matrikel);

				verticalPanel.add(linkMatrikel);
				
				mapEvents.put(linkStudiengangName.getTargetHistoryToken(), studiengang);
			}

			/*
			 * FachbereichTabele in der Hauptabellen positionieren
			 */
			mainPanel.add(verticalPanel);
			
		}

	}

	public void onHistoryChanged(String historyToken) {
		
		
		if (mapEvents.containsKey(historyToken)) {
			
		} else {
			getController().fireEvent(new RemoveViewEvent(this), true, false, false);
		}
		
		
	}
}
